Date : 29/8/93
Protection : MOT DE PASSE
Programme : LOTUS
Outils : SOFT-ICE V2.50
Fichier : LOTUS.EXE
Temps pass� : 15mn
Soci�t� : Gremlin
Origine : B. Michel
Divers : Cr�ation d'un lanceur
Num�ro : 4
Apr�s avoir vu ce que valait la protection de Zool (de la m�me
soci�t�), je me suis dit que j'avais certaines chances pour cracker
ce jeu-ci. Effectivement, apr�s 2 ou 3 essais je trouve le saut fati-
dique qui permet d'arriver au jeu sans avoir rentr� le code. H�las,
comme pour Zool, on ne trouve aucune trace dans aucun des fichiers de
la cha�ne � patcher. Donc, j'en arrive � cr�er un lanceur et cela
fonctionne tr�s bien. Ci-dessous, le saut � changer :
12F4:3099 7408 JZ 30A3 ; Doit devenir un
; JNZ 30A3.
Ci-dessous le lanceur en question :
; PATCH POUR LE PROGRAMME LOTUS
;
;******************************************************************************
; ZONE A INITIALISER
adr_ip1 equ 03099h ; Adresse dont le contenu est � modifier.
anc_val equ 0874h ; Valeur d'origine � rechercher, invers�e.
nouv_val equ 0875h ; Nouvelle valeur (la modif).
INT_DET equ 16h ; Le num�ro de l'INT que l'on veut utiliser.
BEEP_TONE equ 440 ; Fr�quence de la note.
;******************************************************************************
seg_a segment byte public
assume cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a
org 100h
sto proc far
start:
jmp init ; r�duire la m�moire et d�placer la
db 90h ; pile plus pr�s.
paramet dw 0 ; M�me bloc d'environnement.
ENVIR dw 0 ; Les param�tres de la ligne de
data_3 dw 0 ; commande sont recopi�s ici puis
FCB_1 dw 0 ; transmis au programme fils. ( 80h )
data_5 dw 0
FCB_2 dw 0
data_7 dw 0
sauve_SP dw 0
sauve_SS dw 0
data_9 dw 0, 0
drap equ 0
;------------------------------ PROGRAMME PERE ------------------------------
loc_1: mov sauve_SP,sp
mov sauve_SS,ss
mov ax,80h
mov ENVIR,ax ; Ligne de commande...
mov data_3,ds
mov ax,5Ch ; Premier FCB ( inutilis� )
mov FCB_1,ax
mov data_5,ds
mov ax,6Ch ; Second FCB ( inutilis� )
mov FCB_2,ax
mov data_7,ds
mov ah,35h
mov al,INT_DET
int 21h ; DOS Services ah=function 35h
; get intrpt vector al in es:bx
mov cs:data_9,bx
mov word ptr cs:data_9+2,es
mov ah,25h
mov al,INT_DET
lea dx,cs:[_int] ; Load effective addr
int 21h ; DOS Services ah=function 25h
; set intrpt vector al to ds:dx
lea dx,cs:[nom_prg] ; Load effective addr
push ds
pop es
lea bx,cs:[paramet] ; Load effective addr
mov al,0
mov ah,4Bh
int 21h ; Appel du programme fils.
; run progm @ds:dx, parm @es:bx
mov sp,sauve_SP
mov ss,sauve_SS
cmp al,2 ; teste le code de retour du programme
jnz ok ; fils, 02 si pas trouv�.
mov dx,offset mess_err
mov ah,9
int 21h
; Les cinq instructions suivantes sont facultatives puisque le
; vecteur d'origine est remis en place d�s que le patch est effectu�.
; Le seul but est d'�viter le plantage du PC dans l'hypoth�se o� l'on
; lance le programme p�re et que celui-ci ne trouve pas le programme
; fils. A ce moment l� on remet tout en place et on quitte.
ok: mov ah,25h
mov al,INT_DET
mov dx,cs:data_9
mov ds,word ptr cs:data_9+2
int 21h
mov ah,4Ch
int 21h ; terminate with al=return code
sto endp
;---------------------------- int d�tourn�e --------------------------------
int_entry proc far
_int: jmp apres
_SAUVE_SP dw 0,0
apres: push ax
push ds
push bx
push cx
push dx
pushf ; Push flags
mov dx,305h
in al,dx
mov word ptr cs:[_SAUVE_SP],sp
mov cx,30
prochain: pop ds
dec cx
jz s
cmp word ptr ds:[adr_ip1],anc_val ; Si ok on patche.
jnz prochain
mov word ptr ds:[adr_ip1],nouv_val ; On y place le patch.
xor bx,bx
mov ds,bx
; L'INT 21 n'est pas r�entrante, on ne peut donc pas se servir de
; la fonction 25h ( set int. vector )
mov bx,word ptr cs:data_9 ; Je remets manuellement
mov ds:[INT_DET*4],bx ; en place le vecteur
mov bx,word ptr cs:data_9+2 ; de l'INT d�tourn�e.
mov ds:[INT_DET*4+2],bx
mov dx,304h
in al,dx
;* Sound - Sounds speaker with the following tone and duration:
mov al, 0B6h ; Initialize channel 2 of
out 43h, al ; timer chip
mov dx, 12h ; Divide 1,193,180 hertz
mov ax, 34DCh ; (clock frequency) by
mov bx, BEEP_TONE ; desired frequency
div bx ; Result is timer clock count
out 42h, al ; Low byte of count to timer
mov al, ah
out 42h, al ; High byte of count to timer
mov bx,3 ; Charge BX avec 3 BEEPs
main_b: in al, 61h ; Read value from port 61h
or al, 3 ; Set first two bits
out 61h, al ; Turn speaker on
mov dx,3
rebou: mov cx, 0ffffh
bou: loopnz bou
dec dx
jnz rebou
in al, 61h ; When time elapses, get port value
xor al, 3 ; Kill bits 0-1 to turn
out 61h, al ; speaker off
dec cx
bou1: loopnz bou1
dec bx ; Compteur de boucle.
jnz main_b ; Trois bips...
s: mov sp,word ptr cs:[_SAUVE_SP]
popf
pop dx
pop cx
pop bx
pop ds
pop ax
jmp dword ptr cs:data_9
int_entry endp
;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------
init: ; D�codage du texte.
cld ; Pour incr�menter SI et DI.
xor ax,ax
mov si,offset chaine ; pointe sur le d�but de la chaine.
mov di,si ; DI �galement.
mov cx,offset chaine_fin - offset chaine
; 28 lignes de 6 caract�res sont XOR�s.
; + mess_err ( 30 ) + nom_prog ( 13 ).
toto: lodsb ; On cherche...
xor al,ah ; On XOR.
stosb ; On remet.
xchg ah,al
loop toto ; Et on tourne tant que CX # 0.
mov ax,1a00h ; Test si carte + moniteur VGA
int 10h
cmp al,1ah
je graf ; Si oui on affiche la fen�tre FREDDY_SOFT.
suite1: mov ah,4ah
mov bx,offset fin ; Fin du programme en BX.
mov cl,4 ; Divis� par 4 pour avoir des paragraphes.
shr bx,cl
inc bx ; On en rajoute un par s�curit�.
int 21h ; Execution de la fonction 4Ah.
mov sp,offset fin ; on d�place la pile en "fin" car elle est
jmp loc_1 ; plac�e en FFFE dans un programme COM.
graf: xor ah,ah ; Raz de l'�cran
mov al,3
int 10h
mov ax,1301h ; Mode 01 attribut couleur dans BL.
mov bx,004bh ; Page 0.
mov cx,28 ; nombre de char.
mov dx,0a19h ; ligne,colonne.
lea bp,cs:[chaine]
ligne_suiv: int 10h
inc dh
add bp,28
cmp dh,10h ; 6 lignes de 28 caract�res.
jb ligne_suiv
mov ah,2 ; Pour faire disparaitre le curseur.
xor bh,bh ; Page ecran 0.
mov dh,25
int 10h
xor ah,ah
int 16h ; Attends un char...
jmp suite1
db 55h,0aah ; Identificateur de d�but.
chaine: db '�����������CEDRIC���������Ŀ'
db '� �'
db '� LOTUS Bypass �'
db "� I hope you'll enjoy it �"
db '� �'
db '��� Lan�eur Crypt� V1.1 ����'
mess_err db 0ah,0dh,'Programme enfant non trouv�','$'
nom_prg db 'lotus.exe',0,0,0 ; 12 car max + nul
chaine_fin: db 0aah,55h ; Identificateur de fin.
fin_init label near
;----------------------- PLACE RESERVEE POUR LA PILE ------------------------
dw 100 dup (' ')
fin equ this byte ; ici le sommet de la pile, SP.
seg_a ends
end start
;*******************************************************************************
C�dric
|